home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
A+ Disk Magazine Volume 1, No. 1 (1984)(Ziff-Davis).zip
/
A+ Disk Magazine Volume 1, No. 1 (1984)(Ziff-Davis).do
/
PERPCAL.bas
< prev
next >
Wrap
BASIC Source File
|
1996-12-24
|
10KB
|
230 lines
1 HOME : VTAB 8: HTAB 12: PRINT "A+ DISK MAGAZINE"
2 VTAB 10: HTAB 16: PRINT "PRESENTS"
3 VTAB 12: HTAB 11: INVERSE : PRINT "PERPETUAL CALENDAR": NORMAL
4 FOR I = 1 TO 800: NEXT I
5 VTAB 15: HTAB 12: PRINT "BY MORRIS EFFRON"
6 PRINT "<CTRL-G><CTRL-G><CTRL-G><CTRL-G><CTRL-G>"
7 VTAB 18: HTAB 14: PRINT "PROGRAMMED BY"
8 VTAB 20: HTAB 10: PRINT "OPPENHEIMER SOFTWARE"
9 VTAB 23: HTAB 22: PRINT "(C)COPYRIGHT 1983": FOR I = 1 TO 3500: NEXT I
10 REM ** THE PERPETUAL CALENDAR
50 B$ = " ": FOR I = 1 TO 100:B$ = B$ +" ": NEXT I
60 AS$ = "*": FOR I = 1 TO 100:AS$ = AS$ +"*": NEXT
100 GOSUB 430
105 HOME
107 INVERSE
110 VTAB 1: HTAB 18: PRINT "THE"
140 VTAB 3: HTAB 11: PRINT "PERPETUAL"
170 VTAB 3: HTAB 21: PRINT "CALENDAR"
220 VTAB 1: HTAB 18: PRINT "THE"
240 VTAB 3: HTAB 11: PRINT "PERPETUAL CALENDAR"
260 NORMAL
270 VTAB 7: HTAB 1: PRINT "1. NUMBER OF DAYS BETWEEN TWO DATES."
280 VTAB 9: HTAB 1: PRINT "2. WEEKDAY OF ANY DATE."
290 VTAB 11: HTAB 1: PRINT "3. CALENDAR FOR ANY MONTH."
340 VTAB 13: HTAB 1: PRINT "4. EXIT."
350 VTAB 15: HTAB 7: PRINT "PLEASE ENTER CHOICE: "
390 VTAB 17: HTAB 6: PRINT LEFT$(B$,40): VTAB 15: HTAB 28: PRINT " ": VTAB 15: HTAB 28
400 A$ = "": GET A$: IF A$ = "" THEN GOTO 400
410 VTAB 15: HTAB 28: PRINT A$
415 IF A$ < >"1" AND A$ < >"2" AND A$ < >"3" AND A$ < >"4" THEN VTAB 17: HTAB 7: PRINT "1, 2, 3 OR 4 PLEASE": FOR I = 1 TO 1000: NEXT I: GOTO 390
420 ON VAL(A$) GOSUB 940,1490,1910,2830
425 GOTO 350
430 REM **INITIALIZATION
440 DIM DS$(7),MS$(12),DS(12),NL(7)
445 DIM CL$(5,7)
450 DATA "SUNDAY"
460 DATA "MONDAY"
470 DATA "TUESDAY"
480 DATA "WEDNESDAY"
490 DATA "THURSDAY"
500 DATA "FRIDAY"
510 DATA "SATURDAY"
520 DATA "JANUARY" ,31
540 DATA "FEBRUARY",28
550 DATA "MARCH",31
580 DATA "APRIL",30
590 DATA "MAY",31
600 DATA "JUNE",30
610 DATA "JULY",31
620 DATA "AUGUST",31
630 DATA "SEPTEMBER",30
640 DATA "OCTOBER",31
660 DATA "NOVEMBER",30
690 DATA "DECEMBER",31
750 DATA 1900,2100,2200,2300,2500,2600,2700
830 FOR I = 1 TO 7: READ DS$(I): NEXT I
860 FOR I = 1 TO 12: READ MS$(I),DS(I): NEXT
900 FOR I = 1 TO 7: READ NL(I): NEXT I
920 RETURN
940 REM ** DAYS BETWEEN TWO DATES **
950 VTAB 17: HTAB 3:AD$ = ""
970 INPUT "FIRST DATE (MM/DD/YYYY): ";AD$
980 IF AD$ = "" THEN VTAB 17: HTAB 1: PRINT LEFT$(B$,30): RETURN
990 GOSUB 3050: IF OK THEN 1090
1000 VTAB 19: HTAB 5: PRINT "BAD DATE. PLEASE RE-ENTER."
1020 FOR I = 1 TO 1000: NEXT I: VTAB 19: HTAB 5: PRINT LEFT$(B$,30)
1030 VTAB 17: HTAB 1: PRINT LEFT$(B$,40): GOTO 950
1090 Y1 = Y:M1 = M:D1 = D
1100 VTAB 19: HTAB 2:AD$ = ""
1120 INPUT "SECOND DATE (MM/DD/YYYY): ";AD$
1130 GOSUB 3050: IF OK THEN 1260
1170 VTAB 21: HTAB 5: PRINT "BAD DATE. PLEASE RE-ENTER."
1180 FOR I = 1 TO 1000: NEXT I: VTAB 21: HTAB 5: PRINT LEFT$(B$,40)
1190 VTAB 19: HTAB 1: PRINT LEFT$(B$,40): GOTO 1100
1260 Y2 = Y:M2 = M:D2 = D
1290 GOSUB 3190
1300 VTAB 21: HTAB 10: PRINT "THE NUMBER OF DAYS"
1305 VTAB 22: HTAB 7: PRINT "BETWEEN THESE DATES IS: ";
1350 PRINT TDS
1370 VTAB 23: HTAB 5: PRINT "(PRESS ANY KEY TO CONTINUE)";
1380 A$ = "": GET A$: IF A$ = "" THEN 1380
1390 VTAB 17: HTAB 1: PRINT LEFT$(B$,40): VTAB 19: HTAB 1: PRINT LEFT$(B$,40)
1392 VTAB 21: HTAB 1: PRINT LEFT$(B$,40)
1395 VTAB 22: HTAB 1: PRINT LEFT$(B$,40): VTAB 23: HTAB 1: PRINT LEFT$(B$,39): GOTO 950
1490 REM ** WEEKDAY DETERMINATION ROUTINE
1500 Y1 = 1983:M1 = 1:D1 = 1
1530 VTAB 17: HTAB 3:AD$ = ""
1550 INPUT "DATE (MM/DD/YYYY): ";AD$
1560 IF AD$ = "" THEN VTAB 17: HTAB 3: PRINT LEFT$(B$,40): RETURN
1570 GOSUB 3050: IF OK THEN 1670
1580 VTAB 19: HTAB 3: PRINT "BAD DATE. PLEASE RE-ENTER."
1590 FOR I = 1 TO 1000: NEXT I
1620 VTAB 19: HTAB 3: PRINT LEFT$(B$,40): VTAB 17: HTAB 3: PRINT LEFT$(B$,30): GOTO 1530
1670 Y2 = Y:M2 = M:D2 = D
1700 GOSUB 3190
1710 IF TD >32767 THEN TD = TD -32767: GOTO 1710
1740 WD = INT((TD/7 - INT(TD/7)) *7 +.05) * SGN(TD/7)
1750 IF PR = 0 THEN WD$ = DS$(7 -WD): GOTO 1755
1751 IF WD >0 THEN WD$ = DS$(WD): GOTO 1755
1752 WD$ = DS$(7)
1755 VTAB 20: HTAB 5: PRINT "THIS DAY IS A ";
1760 INVERSE : PRINT WD$: NORMAL
1770 VTAB 22: HTAB 3: PRINT "(PRESS ANY KEY TO CONTINUE)";
1800 A$ = "": GET A$: IF A$ = "" GOTO 1800
1810 VTAB 17: HTAB 1: PRINT LEFT$(B$,40): VTAB 19: HTAB 1: PRINT LEFT$(B$,40)
1815 VTAB 22: HTAB 1: PRINT LEFT$(B$,40): VTAB 20: HTAB 1: PRINT LEFT$(B$,40)
1850 GOTO 1530
1910 REM ** CALENDAR PRINT ROUTINE **
1930 Y1 = 1983:M1 = 1:D1 = 1
1931 VTAB 18: HTAB 5: PRINT "DO YOU HAVE A PRINTER (Y/N)? ";: GET T$
1932 VTAB 18: HTAB 34: PRINT T$
1933 IF T$ = "Y" THEN 1938
1934 VTAB 20: HTAB 5: PRINT "NO PRINTER AVAILABLE"
1935 FOR I = 1 TO 1000: NEXT I
1936 FOR I = 17 TO 22: VTAB INT(I): PRINT LEFT$(B$,40): NEXT I
1937 GOTO 350
1938 VTAB 19: INPUT "ENTER SLOT NUMBER FOR YOUR PRINTER: ";N$
1939 IF N$ = "" OR N$ = "0" THEN N$ = "1"
1940 N% = VAL(N$)
1980 VTAB 21: HTAB 5
1990 INPUT "DATE (MM/YYYY): ";AD$
2000 IF AD$ = "" THEN VTAB 18: HTAB 1: PRINT B$: PRINT LEFT$(B$,40): RETURN
2020 AD$ = "0" +AD$:AD$ = RIGHT$(AD$,7)
2030 AD$ = LEFT$(AD$,3) +"01/" + RIGHT$(AD$,4)
2040 GOSUB 3050: IF OK THEN 2140
2050 VTAB 22: HTAB 1: PRINT "BAD DATE. PLEASE RE-ENTER."
2060 FOR I = 1 TO 1000: NEXT I
2070 HTAB 1: VTAB 21: PRINT LEFT$(B$,40): HTAB 1: VTAB 22: PRINT LEFT$(B$,40): GOTO 1980
2140 Y2 = Y:M2 = M:D2 = D
2150 GOSUB 3190
2180 IF TD >32767 THEN TD = TD -32767: GOTO 2180
2190 WD = INT((TD/7 - INT(TD/7)) *7 +.05) * SGN(TD/7)
2200 IF PR = 0 THEN WD = 7 -WD: GOTO 2250
2210 IF WD = 0 THEN WD = 7
2230 VTAB 23: HTAB 5: PRINT "PRESS ANY KEY TO PRINT ";
2250 A$ = "": GET A$: IF A$ = "" THEN 2250
2251 VTAB 23: PRINT LEFT$(B$,40);
2260 PR# N%: PRINT CHR$(9); CHR$(1); CHR$(1);"80N";
2270 MX = DS(M2): IF LL AND M2 = 2 THEN MX = 29
2280 DM = 0
2290 FOR I = 1 TO 5
2300 FOR J = 1 TO 7
2310 IF ((I -1) *7) +J <WD OR DM +1 >MX THEN CL$(I,J) = "*" + LEFT$(B$,10): GOTO 2325
2320 DM = DM +1:DM$ = STR$(DM):CL$(I,J) = "* " +DM$ + LEFT$(B$,(9 - LEN(DM$)))
2325 NEXT J
2330 NEXT I
2340 ST = 0
2345 IF DM = MX THEN 2380
2350 FOR I = DM +1 TO MX
2360 ST = ST +1:CL$(5,ST) = LEFT$(CL$(5,ST),4) +"/" + STR$(I) + LEFT$(B$,4)
2370 NEXT I
2380 LN = LEN(MS$(M2)) + LEN( STR$(Y2)) +1
2390 LN = INT((80 -LN)/2): PRINT CHR$(12): PRINT LEFT$(B$,LN);MS$(M2);" "; STR$(Y2)
2405 PRINT
2440 PRINT " "; LEFT$(AS$,78)
2490 GOSUB 3480: PRINT " ";
2500 FOR I = 1 TO 7:LD = LEN(DS$(I))
2505 S1 = 10 -LD:S2 = INT(S1/2):S3 = S1 -S2
2510 PRINT "*";: IF S2 < >0 THEN PRINT LEFT$(B$,S2);
2520 PRINT DS$(I);: IF S3 < >0 THEN PRINT LEFT$(B$,S3);
2530 NEXT I
2540 PRINT "*": GOSUB 3480
2560 GOSUB 3540
2570 FOR I = 1 TO 5
2580 PRINT " ";
2590 FOR J = 1 TO 7: PRINT CL$(I,J);
2600 NEXT J: PRINT "*"
2630 FOR J = 1 TO 5: GOSUB 3480: NEXT J
2660 IF I <5 THEN GOSUB 3540: NEXT I
2670 PRINT " "; LEFT$(AS$,78)
2715 PRINT CHR$(12): PR# 0
2720 VTAB 23: HTAB 5: PRINT "(PRESS ANY KEY TO CONTINUE)";
2730 A$ = "": GET A$: IF A$ = "" THEN 2730
2740 VTAB 21: HTAB 1: PRINT LEFT$(B$,40): VTAB 23: HTAB 1: PRINT LEFT$(B$,39)
2750 VTAB 20: HTAB 1: PRINT LEFT$(B$,40)
2800 GOTO 1980
2830 HOME
2835 END
3050 REM ** DATE VALIDATION
3060 OK = 0
3070 AL = LEN(AD$): IF AL = 10 THEN 3090
3075 IF MID$ (AD$,2,1) = "/" THEN AD$ = "0" +AD$:AL = AL +1: IF AL = 10 THEN 3090
3080 IF MID$ (AD$,5,1) = "/" THEN AD$ = LEFT$(AD$,3) +"0" + RIGHT$(AD$,6)
3090 IF MID$ (AD$,3,1) < >"/" THEN RETURN
3092 IF MID$ (AD$,6,1) < >"/" THEN RETURN
3120 Y = VAL( RIGHT$(AD$,4)): IF Y <1800 OR Y >2800 THEN RETURN
3130 LP = 0: IF Y/100 < > INT(Y/100) THEN IF Y/4 = INT(Y/4) THEN LP = -1
3140 IF Y = 2000 OR Y = 2400 OR Y = 2800 THEN LP = -1
3145 M = VAL( LEFT$(AD$,2)): IF M <1 OR M >12 THEN RETURN
3150 MX = DS(M): IF M = 2 AND LP THEN MX = 29
3160 D = VAL( MID$ (AD$,4,2)): IF D <1 OR D >MX THEN RETURN
3170 OK = -1: RETURN
3190 REM ** COMPUTES DAYS BETWEEN DATES
3210 PR = 0:TD = 0
3220 IF Y1 <Y2 THEN PR = -1
3240 IF Y1 = Y2 AND M1 <M2 THEN PR = -1
3250 IF Y1 = Y2 AND M1 = M2 AND D1 <D2 THEN PR = -1
3260 L1 = 0: IF Y1/100 < > INT(Y1/100) THEN IF Y1/4 = INT(Y1/4) THEN L1 = -1
3265 IF Y1 = 2000 OR Y1 = 2400 OR Y1 = 2800 THEN L1 = -1
3270 L2 = 0: IF Y2/100 < > INT(Y2/100) THEN IF Y2/4 = INT(Y2/4) THEN L2 = -1
3275 IF Y2 = 2000 OR Y2 = 2400 OR Y2 = 2800 THEN L2 = -1
3280 FY = Y1:FM = M1:FD = D1:FL = L1:LY = Y2:LM = M2:LD = D2:LL = L2
3282 IF PR = 0 THEN FY = Y2:FM = M2:FD = D2:FL = L2:LY = Y1:LM = M1:LD = D1:LL = L1
3290 NY = LY -FY: IF NY >0 THEN TD = INT(NY *365.25) -365
3310 FOR I = 1 TO 7
3320 IF NL(I) >FY AND NL(I) <LY THEN TD = TD -1
3330 NEXT I
3335 IF LM -1 = 0 THEN 3345
3340 FOR I = 1 TO LM -1:TD = TD +DS(I): NEXT I
3345 IF NY < >2 AND NY < >3 THEN 3370
3347 FOR I = FY +1 TO LY -1: IF I/100 < > INT(I/100) THEN IF I/4 = INT(I/4) THEN TD = TD +1
3350 IF I = 2000 OR I = 2400 OR I = 2800 THEN TD = TD +1
3355 NEXT I
3370 IF LL AND LM >2 THEN TD = TD +1
3380 TD = TD +LD
3389 IF FM = 12 THEN 3420
3390 FOR I = FM +1 TO 12:TD = TD +DS(I): NEXT I
3420 TD = TD +DS(FM) -FD
3430 IF FL AND FM <3 THEN TD = TD +1
3440 IF FY < >LY THEN RETURN
3445 IF LL THEN TD = TD -366: RETURN
3450 TD = TD -365: RETURN
3470 REM ** CALENDAR PRINT ROUTINES **
3480 PRINT " ";
3490 FOR K = 1 TO 7: PRINT "*" + LEFT$(B$,10);: NEXT K
3520 PRINT "*"
3530 RETURN
3540 PRINT " "; LEFT$(AS$,78): RETURN
3550 FOR K = 1 TO 7: PRINT LEFT$(AS$,11);: NEXT K
3560 RETURN